   // 1.局部作用域和全局作用域
  //  let val = 1;
  //  function foo() {
  //    console.log(val);
  //  }
  //  function bar() {
  //    let val = 2;
  //    foo();
  //  }
  //  bar();


   // 2.this指向
  //  Window.name = 'ByteDance';
  //  function A() {
  //    this.name = 123;
  //  }
  //  A.prototype.getA = function () {
  //    return this.name + 1;
  //  };
  //  let a = new A();
  //  let funcA = a.getA;
  //  console.log(funcA());
  //  // 解释完上面答下面这种情况
  //  console.log(a.getA());


   // 3.this指向(call)
  //  const obj = {
  //    birth: 1990,
  //    getAge(year) {
  //      let fn = y => y - this.birth;
  //      return fn.call({ birth: 2000 }, year);
  //    },
  //  };
  //  console.log(obj.getAge(2020));

   // 4.执行顺序 ***
  //  async function async1() {
  //    console.log('async1 start');
  //    await async2();
  //    console.log('async1 end');
  //  }
  //  async function async2() {
  //    console.log('async2');
  //  }
  //  console.log('script start');
  //  setTimeout(() => {
  //    console.log('setTimeout');
  //  }, 0);
  //  async1();
  //  new Promise(function (resolve) {
  //    console.log('promise1');
  //    resolve();
  //  }).then(function () {
  //    console.log('promise2');
  //  });
  //  console.log('script end');

  // 5 -----------------------------------------
   // 1. 也是关于this的，还有闭包，和一面差不多
   // 2. 作用域？变量提升？
  //  for(var i=0;i<5;i++){
  //    setTimeout(()=>{
  //      console.log(i);
  //    },0)
  //  }
   // 如果要按顺序输出
   // 1. 块级作用域
   // for(let i=0;i<5;i++){
   //   setTimeout(()=>{
   //     console.log(i);
   //   },0)
   // }
   // 2.闭包
  //  for(var i=0;i<5;i++){
  //    ((j) =>{
  //      setTimeout(()=>{
  //        console.log(j)
  //      },0)
  //    })(i)
  //  }

   //6. 也是关于event loop的，和一面的执行顺序差不多，让具体解释了一下宏任务和微任务

  //  console.log(typeof typeof typeof null)

  //  console.log('abcdcba'.replace(/c/g, 'h'))

  //  console.log('abcdCba'.replace(/c/g, 'h'))

  //  var a = {
  //    name: 'A',
  //    fun: function(){
  //      console.log(this.name);
  //    }
  //  };
  //  a.fun(); //A
  //  a.fun.call({name: 'B'});//B
  //  var fun1 = a.fun;
  //  fun1(); //

  //  var a = {
  //    name: 'A',
  //    fun: () => {console.log(this.name);}
  //  };
  //  a.fun();
  //  a.fun.call({name: 'B'});
  //  var fun1 = a.fun;
  //  fun1();

  //  console.log(typeof Date)
  //  console.log(typeof Date()) 
  //  console.log(new Date)
  //  console.log(new Date()) 

   // 隐式转换
  //  if ([]) console.log(1);
  //  if ([].length) console.log(2);
  //  if ([] == 0) console.log(3);
  //  if ({} === {}) console.log(4);

  //  function Person() {}
  //  let p = new Person();
  //  // 写出p与Person的关系（尽可能多）
  //  console.log(p.__proto__ === Person.prototype); // true
  //  console.log(p.constructor === Person);  // true
  //  console.log(Person.prototype.__proto__ === Object.prototype);  // true
  //  console.log(p.__proto__.__proto__=== Object.prototype);  // true
  //  console.log(p instanceof Person);  // true
  //  console.log(p instanceof Object);  // true


   // 折磨
   function Foo() {
       getName = function() {
           console.log('1');
       }
       return this;
   }
   Foo.getName = function() { console.log('2'); }
   Foo.prototype.getName = function() { console.log('3'); }
   var getName = function() {
       console.log('4');
   }
   function getName(){
     console.log('5')
   }
   // 判断以下输出
   Foo.getName();
   getName();
   Foo().getName();
   getName();
   new Foo.getName();
   new Foo().getName();
   new new Foo().getName();


